home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Libraries / PlayerPRO 4.4.1 / Filters Plugs / ToneGenerator.c < prev    next >
C/C++ Source or Header  |  1995-04-16  |  10KB  |  422 lines

  1. /*    ToneGenerator    */
  2. /*    v 1.0            */
  3. /*    1995 by ANR     */
  4.  
  5.  
  6. #include "MAD.h"
  7. #include "PPPlug.h"
  8. #include "math.h"
  9.  
  10. #if defined(powerc) || defined(__powerc)
  11. enum {
  12.         PlayerPROPlug = kCStackBased
  13.         | RESULT_SIZE(SIZE_CODE( sizeof(OSErr)))
  14.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof( Ptr*)))
  15.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof( struct FileInstrData*)))
  16.         | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof( long)))
  17.         | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof( long)))
  18.         | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof( PPInfoPlug*)))
  19. };
  20.  
  21. ProcInfoType __procinfo = PlayerPROPlug;
  22. #else
  23. #include <A4Stuff.h>
  24. #endif
  25.  
  26. enum
  27. {
  28.     silence = 3,
  29.     triangle = 4,
  30.     square = 5,
  31.     wave = 6
  32. };
  33.  
  34. #define        PI              3.1415926535897932384626433
  35. #define        KHZ                22254.54545
  36.  
  37. GDHandle    TheGDevice:0xCC8;
  38.  
  39. void AutoPosition( DialogPtr aDia)
  40. {
  41.     Point    Position, mouse;
  42.     Rect    ViewRect;
  43.     short    XSize = (aDia->portRect.right - aDia->portRect.left), YSize = (aDia->portRect.bottom - aDia->portRect.top);
  44.     
  45.     
  46.     GetMouse( &mouse);
  47.     LocalToGlobal( &mouse);
  48.     
  49.     SetRect( &ViewRect, (*TheGDevice)->gdRect.left + 8, (*TheGDevice)->gdRect.top + 43,
  50.                         (*TheGDevice)->gdRect.right - 8, (*TheGDevice)->gdRect.bottom - 8);
  51.     
  52.     Position.h = mouse.h - XSize/2;
  53.     if( Position.h + XSize >= ViewRect.right) Position.h = ViewRect.right - XSize;
  54.     else if( Position.h <= ViewRect.left) Position.h = ViewRect.left;
  55.     
  56.     Position.v = mouse.v - YSize/2;
  57.     if( Position.v + YSize >= ViewRect.bottom) Position.v = ViewRect.bottom - YSize;
  58.     else if( Position.v <= ViewRect.top) Position.v = ViewRect.top;
  59.     
  60.     MoveWindow( aDia, Position.h, Position.v, false);
  61.     
  62.     ShowWindow( aDia);
  63. }
  64.  
  65. void GetDText (DialogPtr dlog, short item, StringPtr str)
  66. {
  67. Handle    itemHandle;
  68. short    itemType;
  69. Rect    itemRect;
  70.  
  71.     GetDItem (dlog, item, &itemType, &itemHandle, &itemRect);
  72.     GetIText (itemHandle, str);
  73. }
  74.  
  75. void SetDText (DialogPtr dlog, short item, Str255 str)
  76. {
  77. Handle    itemHandle;
  78. short    itemType;
  79. Rect    itemRect;
  80.  
  81.     GetDItem (dlog, item, &itemType, &itemHandle, &itemRect);
  82.     SetIText (itemHandle, str);
  83. }
  84.  
  85. Ptr    CreateAudio8Ptr( long AudioLength, long AudioFreq, long AudioAmp, long AudioType)
  86. {
  87.     Ptr        Audio8Ptr;
  88.     long    i, temp, inter, x, dest;
  89.     Boolean    UpDown;
  90.     
  91.     Audio8Ptr = NewPtr( AudioLength);
  92.     if( Audio8Ptr == 0L) return 0L;
  93.     
  94.     switch( AudioType)
  95.     {
  96.         case wave:
  97.             for( i = 0; i < AudioLength; i++)
  98.             {
  99.         
  100.                 temp = 127. * sin( ( ((double) i * (double) AudioFreq * PI * 2.) / KHZ));
  101.  
  102.                 /** Amplitude resizing **/
  103.                 temp *= AudioAmp;
  104.                 temp /= 100;
  105.  
  106.                 /** Overshoot **/
  107.                 if( temp >= 127) temp = 127;
  108.                 else if( temp <= -127 ) temp = -127;
  109.                 
  110.                 Audio8Ptr[ i] = temp;
  111.             }
  112.         break;
  113.             
  114.         case silence:
  115.             for( i = 0; i < AudioLength; i++) Audio8Ptr[ i] = 0x00;
  116.         break;
  117.         
  118.         case square:
  119.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  120.             {
  121.                 if( i > dest)
  122.                 {
  123.                     x++;
  124.                     dest = (x * KHZ) / (AudioFreq * 2);
  125.                     if( inter == -127) inter = 127;
  126.                     else inter = -127;
  127.                 }
  128.                 
  129.                 temp = inter;
  130.                 
  131.                 /** Amplitude resizing **/
  132.                 temp *= AudioAmp;
  133.                 temp /= 100;
  134.  
  135.                 /** Overshoot **/
  136.                 if( temp >= 127) temp = 127;
  137.                 else if( temp <= -127 ) temp = -127;
  138.                 
  139.                 Audio8Ptr[ i] = temp;
  140.             }
  141.         break;
  142.         
  143.         case triangle:
  144.             UpDown = true;
  145.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  146.             {
  147.                 if( i > dest)
  148.                 {
  149.                     x++;
  150.                     dest = (x * KHZ) / (AudioFreq * 2);
  151.                     inter = dest - i;
  152.                     
  153.                     UpDown = !UpDown;
  154.                 }
  155.                 
  156.                 if( UpDown) temp = (256 * (dest - i)) / inter;
  157.                 else temp = (256 * (inter - (dest - i))) / inter;
  158.                 
  159.                 temp -= 127;
  160.                 
  161.                 /** Amplitude resizing **/
  162.                 temp *= AudioAmp;
  163.                 temp /= 100;
  164.  
  165.                 /** Overshoot **/
  166.                 if( temp >= 127) temp = 127;
  167.                 else if( temp <= -127 ) temp = -127;
  168.                 
  169.                 Audio8Ptr[ i] = temp;
  170.             }
  171.         break;
  172.     }
  173.     
  174.     return Audio8Ptr;
  175. }
  176.  
  177. short* CreateAudio16Ptr( long AudioLength, long AudioFreq, long AudioAmp, long AudioType)
  178. {
  179.     short    *Audio16Ptr;
  180.     long    i, temp, inter, x, dest;
  181.     Boolean    UpDown;
  182.  
  183.     Audio16Ptr = (short*) NewPtr( AudioLength*2);
  184.     if( Audio16Ptr == 0L) return 0L;
  185.  
  186.     switch( AudioType)
  187.     {
  188.         case wave:
  189.             for( i = 0; i < AudioLength; i++)
  190.             {
  191.         
  192.                 temp = 32767. * sin( ( ((double) i * (double) AudioFreq * PI * 2.) / KHZ));
  193.  
  194.                 /** Amplitude resizing **/
  195.                 temp *= AudioAmp;
  196.                 temp /= 100;
  197.  
  198.                 /** Overshoot **/
  199.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  200.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  201.                 
  202.                 Audio16Ptr[ i] = temp;
  203.             }
  204.         break;
  205.             
  206.         case silence:
  207.             for( i = 0; i < AudioLength; i++) Audio16Ptr[ i] = 0x00;
  208.         break;
  209.         
  210.         case square:
  211.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  212.             {
  213.                 if( i > dest)
  214.                 {
  215.                     x++;
  216.                     dest = (x * KHZ) / (AudioFreq * 2);
  217.                     if( inter == -32767L) inter = 32767L;
  218.                     else inter = -32767L;
  219.                 }
  220.                 
  221.                 temp = inter;
  222.                 
  223.                 /** Amplitude resizing **/
  224.                 temp *= AudioAmp;
  225.                 temp /= 100;
  226.  
  227.                 /** Overshoot **/
  228.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  229.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  230.                 
  231.                 Audio16Ptr[ i] = temp;
  232.             }
  233.         break;
  234.         
  235.         case triangle:
  236.             UpDown = true;
  237.             for( i = 0, x = 0, dest = -1; i < AudioLength; i++)
  238.             {
  239.                 if( i > dest)
  240.                 {
  241.                     x++;
  242.                     dest = (x * KHZ) / (AudioFreq * 2);
  243.                     inter = dest - i;
  244.                     
  245.                     UpDown = !UpDown;
  246.                 }
  247.                 
  248.                 if( UpDown) temp = (65535L * (dest - i)) / inter;
  249.                 else temp = (65535L * (inter - (dest - i))) / inter;
  250.                 
  251.                 temp -= 32767L;
  252.                 
  253.                 /** Amplitude resizing **/
  254.                 temp *= AudioAmp;
  255.                 temp /= 100;
  256.  
  257.                 /** Overshoot **/
  258.                 if( temp >= (short) 0x7FFF) temp = 0x7FFF;
  259.                 else if( temp <= (short) 0x8000 ) temp = (short) 0x8000;
  260.                 
  261.                 Audio16Ptr[ i] = temp;
  262.             }
  263.         break;
  264.     }
  265.  
  266.     return Audio16Ptr;
  267. }
  268.  
  269. OSErr main(     Ptr                        *InstrumentPtr,
  270.                 struct FileInstrData    *theData,
  271.                 long                    SelectionStart,
  272.                 long                    SelectionEnd,
  273.                 PPInfoPlug                *thePPInfoPlug)
  274. {
  275. long                i, AudioLength, AudioFreq, AudioAmp;
  276. Ptr                    Sample8Ptr = *InstrumentPtr, Audio8Ptr;
  277. short                *Sample16Ptr = (short*) *InstrumentPtr, *Audio16Ptr;
  278. DialogPtr            myDia;
  279. short                itemHit, itemType, AudioType;
  280. Handle                itemHandle;
  281. Rect                itemRect;
  282. Str255                tStr;
  283. OSErr                iErr;
  284.  
  285. #ifndef powerc
  286.     long    oldA4 = SetCurrentA4();             //this call is necessary for strings in 68k code resources
  287. #endif
  288.  
  289.     myDia = GetNewDialog( 128, 0L, (WindowPtr) -1L);
  290.     SetPort( myDia);
  291.     AutoPosition( myDia);
  292.     /** Default values **/
  293.     
  294.     AudioType = silence;
  295.     GetDItem( myDia, AudioType, &itemType, &itemHandle, &itemRect);
  296.     SetCtlValue( (ControlHandle) itemHandle, 255);
  297.     
  298.     AudioLength = SelectionEnd - SelectionStart;
  299.     if( theData->amplitude == 16) AudioLength /= 2;
  300.     if( AudioLength <= 0) AudioLength = 2000;
  301.     NumToString( AudioLength, tStr);    SetDText( myDia, 8, tStr);
  302.         
  303.     AudioFreq    = 440;                                NumToString( AudioFreq, tStr);        SetDText( myDia, 9, tStr);
  304.     AudioAmp    = 100;                                NumToString( AudioAmp, tStr);        SetDText( myDia, 10, tStr);
  305.     
  306.     SelIText( myDia, 8, 0, 10000);
  307.     /********************/
  308.     
  309.     Audio8Ptr    = 0L;    Audio16Ptr    = 0L;
  310.     
  311.     do
  312.     {
  313.         #if defined(powerc) || defined(__powerc)
  314.         ModalDialog( thePPInfoPlug->MyDlgFilterUPP, &itemHit);
  315.         #else
  316.         ModalDialog( (ModalFilterProcPtr) thePPInfoPlug->MyDlgFilterUPP, &itemHit);
  317.         #endif
  318.         
  319.         switch( itemHit)
  320.         {
  321.             case 7:
  322.                 GetDText( myDia, 8, tStr);        StringToNum( tStr, &AudioLength);
  323.                 GetDText( myDia, 9, tStr);        StringToNum( tStr, &AudioFreq);
  324.                 GetDText( myDia, 10, tStr);        StringToNum( tStr, &AudioAmp);
  325.                 
  326.                 switch( theData->amplitude)
  327.                 {
  328.                     case 8:
  329.                         if( Audio8Ptr != 0L) { DisposPtr( Audio8Ptr);            Audio8Ptr = 0L;}
  330.                         Audio8Ptr    = CreateAudio8Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  331.                         if( Audio8Ptr != 0L)
  332.                         {
  333.                             iErr = CallRPlaySoundUPP( Audio8Ptr, AudioLength, 0, 0, theData->amplitude, 0, 0);
  334.                         }
  335.                     break;
  336.                     
  337.                     case 16:
  338.                         if( Audio16Ptr != 0L) { DisposPtr( (Ptr) Audio16Ptr);    Audio16Ptr = 0L;}
  339.                         Audio16Ptr    = CreateAudio16Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  340.                         if( Audio16Ptr != 0L)
  341.                         {
  342.                             iErr = CallRPlaySoundUPP( (Ptr) Audio16Ptr, AudioLength*2, 0, 0, theData->amplitude, 0, 0);
  343.                         }
  344.                     break;
  345.                 }
  346.             break;
  347.         
  348.             case 20:
  349.             case 19:
  350.             case 17:
  351.             case 18:
  352.             case 16:
  353.             case 3:
  354.             case 4:
  355.             case 5:
  356.             case 6:
  357.             
  358.                 switch( itemHit)
  359.                 {
  360.                     case 19:
  361.                     case 20:    itemHit = 3;    break;
  362.                     case 18:    itemHit = 5;    break;
  363.                     case 17:    itemHit = 4;    break;
  364.                     case 16:    itemHit = 6;    break;
  365.                 }
  366.             
  367.                 for( i = 3; i <= 6;i ++)
  368.                 {
  369.                     GetDItem( myDia, i, &itemType, &itemHandle, &itemRect);
  370.                     SetCtlValue( (ControlHandle) itemHandle, 0);
  371.                 }
  372.                 
  373.                 AudioType = itemHit;
  374.                 GetDItem( myDia, AudioType, &itemType, &itemHandle, &itemRect);
  375.                 SetCtlValue( (ControlHandle) itemHandle, 255);
  376.             break;
  377.         }
  378.         
  379.     }while( itemHit != 1 && itemHit != 2);
  380.     
  381.     if( itemHit == 1)
  382.     {
  383.         Ptr        resultPtr;
  384.         
  385.         GetDText( myDia, 8, tStr);        StringToNum( tStr, &AudioLength);
  386.         GetDText( myDia, 9, tStr);        StringToNum( tStr, &AudioFreq);
  387.         GetDText( myDia, 10, tStr);        StringToNum( tStr, &AudioAmp);
  388.         
  389.         if( Audio16Ptr != 0L)    {    DisposPtr( (Ptr) Audio16Ptr);            Audio16Ptr = 0L;}
  390.         if( Audio8Ptr != 0L)    {    DisposPtr( (Ptr) Audio8Ptr);            Audio8Ptr = 0L;}
  391.         
  392.         switch( theData->amplitude)
  393.         {
  394.             case 8:        Audio8Ptr    = CreateAudio8Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);    break;
  395.             case 16:
  396.                 Audio16Ptr    = CreateAudio16Ptr( AudioLength, AudioFreq, AudioAmp, AudioType);
  397.                 AudioLength *= 2;
  398.             break;
  399.         }
  400.         
  401.         resultPtr = NewPtr( theData->insSize - (SelectionEnd - SelectionStart) + AudioLength);
  402.         
  403.         BlockMove( *InstrumentPtr, resultPtr, SelectionStart);
  404.         
  405.         if( theData->amplitude == 8) BlockMove( Audio8Ptr, resultPtr + SelectionStart, AudioLength);
  406.         else BlockMove( Audio16Ptr, resultPtr + SelectionStart, AudioLength);
  407.         
  408.         BlockMove( *InstrumentPtr + SelectionEnd, resultPtr + SelectionStart + AudioLength, theData->insSize - SelectionEnd);
  409.         
  410.         DisposPtr( *InstrumentPtr);        DisposPtr( Audio8Ptr);
  411.         *InstrumentPtr = resultPtr;
  412.         theData->insSize = theData->insSize - (SelectionEnd - SelectionStart) + AudioLength;
  413.     }
  414.     
  415.     DisposDialog( myDia);
  416.  
  417.     #ifndef powerc
  418.         SetA4( oldA4);
  419.     #endif
  420.  
  421.     return noErr;
  422. }